package br.com.ac.fatureweb.service;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ac.fatureweb.exception.AccessNaoAutorizadoException;
import br.com.ac.fatureweb.integration.enums.EnumStatus;
import br.com.ac.fatureweb.integration.model.LeituristaVO;
import br.com.ac.fatureweb.model.Leiturista;
import br.com.ac.fatureweb.model.carga.LeituristaSaae;
import br.com.ac.fatureweb.utilitary.Criptografia;
import br.com.ac.fatureweb.utilitary.NgcDefaultBean;

@Local
@Named
@Stateless
@SuppressWarnings("all")
public class NgcLeituristaBean extends NgcDefaultBean<Leiturista> {

	@PersistenceContext
	private EntityManager entityManager;

	@PostConstruct
	void inicialize() {
		setEm(entityManager);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * br.com.ac.fatureweb.utilitary.NgcDefaultBean#persist(java.lang.Object)
	 */
	@Override
	public Leiturista persist(Leiturista entity) {
		entity.setDataGeracaoSenha(new Date());
		entity.setFlgAtualizaSenha(true);
		entity.setStatus(EnumStatus.ATIVO);

		entity.setSenha(Criptografia.executeMd5(entity.getSenha()));

		entityManager.persist(entity);

		Leiturista beanCriado = entity;
		beanCriado.setCodigo(entity.getId().longValue());

		entityManager.merge(beanCriado);

		return beanCriado;
	}

	@Override
	public Leiturista merge(Leiturista entity) {
		entity.setSenha(Criptografia.executeMd5(entity.getSenha()));
		return super.merge(entity);
	}

	/**
	 * List all leiturista active.
	 *
	 * @return
	 */
	public List<Leiturista> getLstLeiturista() {
		Query query = entityManager
				.createQuery("FROM Leiturista WHERE status=:status");

		query.setParameter("status", EnumStatus.ATIVO);

		return query.getResultList();
	}

	/**
	 * Validar o acesso do equipamento.
	 *
	 * @param imei
	 * @return
	 * @throws AccessNaoAutorizadoException
	 */
	public boolean validarAcessoEquipamento(String imei)
			throws AccessNaoAutorizadoException {

		if (imei == null) {
			throw new AccessNaoAutorizadoException("Equipamento não informado.");
		}

		Query query = entityManager
				.createQuery("FROM Equipamento WHERE imei=:imei "
						+ "AND status=:status");

		query.setParameter("status", EnumStatus.ATIVO);
		query.setParameter("imei", imei);

		List resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {
			return true;
		}

		return false;
	}

	/**
	 * Validar as crendiciais do usuário informado.
	 *
	 * @param usuario
	 * @param senha
	 * @return
	 * @throws AccessNaoAutorizadoException
	 */
	public boolean validarAcessoUsuarioMobile(Long usuario, String senha)
			throws AccessNaoAutorizadoException {

		if (usuario == null || senha == null) {
			throw new AccessNaoAutorizadoException(
					"Credenciais não foram informadas para autenticação.");
		}

		Query query = entityManager
				.createQuery("FROM Leiturista WHERE codigo=:codigo "
						+ " AND senha=:senha AND status=:status");

		query.setParameter("status", EnumStatus.ATIVO);
		query.setParameter("codigo", usuario);
		query.setParameter("senha", senha);

		List resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {
			return true;
		}

		return false;
	}

	/**
	 * Buscar os dados para o usuário informado.
	 *
	 * @param usuario
	 * @return
	 */
	public LeituristaVO buscarUsuarioMobile(Long usuario) {
		Query query = entityManager
				.createQuery("FROM Leiturista WHERE codigo=:codigo");

		query.setParameter("codigo", usuario);

		List<Leiturista> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {
			Leiturista leiturista = resultList.iterator().next();

			if (leiturista.getLeituristaSaae() != null) {
				leiturista.getLeituristaSaae().getCodigo();
			}

			Calendar calendar = Calendar.getInstance(new Locale("pt", "BR"));
			calendar.setTime(leiturista.getDataGeracaoSenha());

			Long dataGeracaoSenha = calendar.getTimeInMillis();

			LeituristaVO leituristaVO = new LeituristaVO(leiturista.getId(),
					leiturista.getCodigo(), leiturista.getNome(),
					leiturista.getEndereco(), leiturista.getNumero(),
					leiturista.getComplemento(), leiturista.getTelefone(),
					leiturista.getEnumTipoCadastrador().ordinal(),
					leiturista.getSenha(), dataGeracaoSenha,
					leiturista.getFlgAtualizaSenha(), leiturista.getCpf(),
					leiturista.getStatus().ordinal(),
					leiturista.getLeituristaSaae() != null ? leiturista
							.getLeituristaSaae().getCodigo() : null);

			return leituristaVO;
		}

		return null;
	}

	/**
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 03/03/2015
	 * @param codigo
	 * @return
	 */
	public Leiturista getLeituristaPorCodigo(Long codigo) {
		Query query = entityManager
				.createQuery("FROM Leiturista WHERE codigo=:codigo");

		query.setParameter("codigo", codigo);

		List<Leiturista> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {
			return resultList.iterator().next();
		}

		return null;
	}

	public List<LeituristaSaae> getLstLeituristaSaae() {
		Query query = entityManager.createQuery("FROM LeituristaSaae");

		List<LeituristaSaae> resultList = query.getResultList();

		return resultList;
	}

}
